home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / h8300 / include / asm / checksum.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  2.3 KB  |  103 lines

  1. #ifndef _H8300_CHECKSUM_H
  2. #define _H8300_CHECKSUM_H
  3.  
  4. /*
  5.  * computes the checksum of a memory block at buff, length len,
  6.  * and adds in "sum" (32-bit)
  7.  *
  8.  * returns a 32-bit number suitable for feeding into itself
  9.  * or csum_tcpudp_magic
  10.  *
  11.  * this function must be called with even lengths, except
  12.  * for the last fragment, which may be odd
  13.  *
  14.  * it's best to have buff aligned on a 32-bit boundary
  15.  */
  16. __wsum csum_partial(const void *buff, int len, __wsum sum);
  17.  
  18. /*
  19.  * the same as csum_partial, but copies from src while it
  20.  * checksums
  21.  *
  22.  * here even more important to align src and dst on a 32-bit (or even
  23.  * better 64-bit) boundary
  24.  */
  25.  
  26. __wsum csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum);
  27.  
  28.  
  29. /*
  30.  * the same as csum_partial_copy, but copies from user space.
  31.  *
  32.  * here even more important to align src and dst on a 32-bit (or even
  33.  * better 64-bit) boundary
  34.  */
  35.  
  36. extern __wsum csum_partial_copy_from_user(const void __user *src, void *dst,
  37.                         int len, __wsum sum, int *csum_err);
  38.  
  39. __sum16 ip_fast_csum(const void *iph, unsigned int ihl);
  40.  
  41.  
  42. /*
  43.  *    Fold a partial checksum
  44.  */
  45.  
  46. static inline __sum16 csum_fold(__wsum sum)
  47. {
  48.     __asm__("mov.l %0,er0\n\t"
  49.         "add.w e0,r0\n\t"
  50.         "xor.w e0,e0\n\t"
  51.         "rotxl.w e0\n\t"
  52.         "add.w e0,r0\n\t"
  53.         "sub.w e0,e0\n\t"
  54.         "mov.l er0,%0"
  55.         : "=r"(sum)
  56.         : "0"(sum)
  57.         : "er0");
  58.     return (__force __sum16)~sum;
  59. }
  60.  
  61.  
  62. /*
  63.  * computes the checksum of the TCP/UDP pseudo-header
  64.  * returns a 16-bit checksum, already complemented
  65.  */
  66.  
  67. static inline __wsum
  68. csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len,
  69.           unsigned short proto, __wsum sum)
  70. {
  71.     __asm__ ("sub.l er0,er0\n\t"
  72.          "add.l %2,%0\n\t"
  73.          "addx    #0,r0l\n\t"
  74.          "add.l    %3,%0\n\t"
  75.          "addx    #0,r0l\n\t"
  76.          "add.l %4,%0\n\t"
  77.          "addx    #0,r0l\n\t"
  78.          "add.l    er0,%0\n\t"
  79.          "bcc    1f\n\t"
  80.          "inc.l    #1,%0\n"
  81.          "1:"
  82.          : "=&r" (sum)
  83.          : "0" (sum), "r" (daddr), "r" (saddr), "r" (len + proto)
  84.          :"er0");
  85.     return sum;
  86. }
  87.  
  88. static inline __sum16
  89. csum_tcpudp_magic(__be32 saddr, __be32 daddr, unsigned short len,
  90.           unsigned short proto, __wsum sum)
  91. {
  92.     return csum_fold(csum_tcpudp_nofold(saddr,daddr,len,proto,sum));
  93. }
  94.  
  95. /*
  96.  * this routine is used for miscellaneous IP-like checksums, mainly
  97.  * in icmp.c
  98.  */
  99.  
  100. extern __sum16 ip_compute_csum(const void *buff, int len);
  101.  
  102. #endif /* _H8300_CHECKSUM_H */
  103.